package com.community.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.community.pojo.Employee;
import com.community.pojo.Menu;
import com.community.pojo.Role;
import com.community.pojo.RoleMenu;
import com.community.service.IMenuService;
import com.community.service.IRoleMenuService;
import com.community.service.IRoleService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * <p>
 * 角色表 前端控制器
 * </p>
 *
 * @author TangHaoSong Fly ChenJie HeYuHang
 * @since 2024-05-15
 */
@CrossOrigin
@RestController
@RequestMapping("/community/role")
public class RoleController {


    @Autowired
    private IRoleService roleService;

    @Autowired
    private IMenuService menuService;

    @Autowired
    private IRoleMenuService roleMenuService;


    /**
     * 根据角色id分配菜单
     * @param roleId
     * @param checkedMenus
     * @return
     */
    @RequestMapping("/saveMenuAssignment/{roleId}")
    @Transactional
    public Object saveMenuAssignment(@PathVariable Integer roleId, @RequestBody List<Menu> checkedMenus) {

        // 1. 根据角色id查询角色信息
        Role role = roleService.getById(roleId);
        if (role == null) {
            throw new RuntimeException("角色不存在");
        }

        // 2. 清空该角色已有的菜单
        roleMenuService.remove(new QueryWrapper<RoleMenu>().eq("role_id",roleId));


        // 3. 将选中的菜单权限分配给该角色
        // 创建一个集合来存储已经插入过的父级菜单的ID
        Set<Integer> insertedParentIds = new HashSet<>();

        for (Menu menu : checkedMenus) {
            // 判断是否存在父级id,不存在就执行插入父级菜单
            if (!menu.getId().equals(menu.getParentId())) {
                if (!insertedParentIds.contains(menu.getParentId())) {
                    // 如果集合中不包含当前父级菜单的ID，则执行插入父级的操作
                    roleMenuService.save(new RoleMenu(null, roleId, menu.getParentId()));
                    // 将已插入的父级菜单ID添加到集合中 ,后续判断是否存在
                    insertedParentIds.add(menu.getParentId());
                }
            }
            roleMenuService.save(new RoleMenu(null, roleId, menu.getId()));
        }

        return true;
    }

    /**
     * 查询所有角色
     *
     * @return
     */
    @RequestMapping("/getRoleList")
    public Object getRoleList() {
        QueryWrapper<Role> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("status", 0);
        queryWrapper.eq("is_delete", 0);

        List<Role> roleList = roleService.list(queryWrapper);

        return roleList;
    }


    /**
     * 有分页和查询的查询所有 角色信息 和所有的菜单
     *
     * @param role
     * @param currentPage
     * @param pageSize
     * @return
     */
    @RequestMapping("/getRoles/{currentPage}/{pageSize}")
    public PageInfo<Role> getRoles(@RequestBody Role role,
                                   @PathVariable Integer currentPage,
                                   @PathVariable Integer pageSize) {
        // 1. 创建 QueryWrapper 对象
        QueryWrapper<Role> wrapper = new QueryWrapper<>();

        // 2. 添加查询条件
        if (role.getName() != null) {
            wrapper.like("name", role.getName());
        }
        wrapper.eq("is_delete",0);

        // 3. 调用 PageHelper 方法开始分页
        PageHelper.startPage(currentPage, pageSize);

        // 4. 执行查询
        List<Role> roleList = roleService.list(wrapper);

        // 5. 查询对应角色的菜单 后续根据拥有的菜单进行选中所拥有的菜单
        for (Role r : roleList) {
            List<Menu> menuList = menuService.getMenusByRoleId(r.getId());
            r.setMenus(menuList);
        }

        // 6. 创建 PageInfo 对象
        PageInfo<Role> pageInfo = new PageInfo<>(roleList);

        // 7. 返回 PageInfo 对象
        return pageInfo;
    }

    /**
     * 新增角色
     *
     * @param role
     * @return
     */
    @RequestMapping("/addRole")
    public Boolean addRole(@RequestBody Role role) {
        return roleService.save(role);
    }


    /**
     * 根据id删除角色
     *
     * @param id
     * @return
     */
    @RequestMapping("/deleteRole/{id}")
    public Object deleteRole(@PathVariable  Integer id) {

        Role role = roleService.getById(id);
        if (role != null) {
            role.setIsDelete(1);
            roleService.updateById(role);
        }
        // 返回相应的结果
        return true;
    }

    /**
     * 根据id修改数据
     * @param role
     * @return
     */
    @RequestMapping("/editRole")
    public Object editRole(@RequestBody Role role) {
        return roleService.updateById(role);
    }


    /**
     * 根据角色id修改status值
     * @param id
     * @return
     */
    @RequestMapping("/updateRolesStatus/{id}")
    public Object updateRolesStatus(@PathVariable Long id) {
        // 根据员工ID从数据库中获取员工信息
        Role role = roleService.getById(id);

        if (role != null) {
            // 更新角色的状态
            // 切换状态，如果为0则 1-0=1 如果为 1 啧1-1=0
            role.setStatus(1 - role.getStatus());

            // 执行更新员工信息的操作
            roleService.updateById(role);
        }
        return true;
    }

}
